import org.junit.Test;
import sun.awt.image.ImageWatched;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

public class leetCodeResult1002 {

    @Test
    public void test() {
        String s = "t ";
//        System.out.println(reverseVowels(s));
        System.out.println(reverseWords(s));
    }

    /**
     * 345. 反转字符串中的元音字母
     * 简单
     * 相关标签
     * premium lock icon
     * 相关企业
     * 给你一个字符串 s ，仅反转字符串中的所有元音字母，并返回结果字符串。
     *
     * 元音字母包括 'a'、'e'、'i'、'o'、'u'，且可能以大小写两种形式出现不止一次。
     */
    public String reverseVowels(String s) {
        char[] charArray = s.toCharArray();
        //创建一个set集合其中存储a e i o u A E I O U这些元音字符
        Set<Character> set = buildYuanYinSet();
        int front = 0;
        int teal = charArray.length - 1;
        while (front < teal) {
            if (set.contains(charArray[front]) && set.contains(charArray[teal])) {
                char temp = charArray[front];
                charArray[front] = charArray[teal];
                charArray[teal] = temp;
                front++;
                teal--;
            } else if (set.contains(charArray[front])) {
                teal--;
            } else if (set.contains(charArray[teal])) {
                front++;
            } else {
                front++;
                teal--;
            }
        }
        return new String(charArray);
    }

    private Set<Character> buildYuanYinSet() {
        Set<Character> set = new HashSet<>();
        set.add('a');
        set.add('e');
        set.add('i');
        set.add('o');
        set.add('u');
        set.add('A');
        set.add('E');
        set.add('I');
        set.add('O');
        set.add('U');
        return set;
    }

    /**
     *151. 反转字符串中的单词
     * 中等
     * 相关标签
     * premium lock icon
     * 相关企业
     * 给你一个字符串 s ，请你反转字符串中 单词 的顺序。
     *
     * 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
     *
     * 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
     *
     * 注意：输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中，单词间应当仅用单个空格分隔，且不包含任何额外的空格。
     */

    public String reverseWords(String s) {
        LinkedList<String> strings = new LinkedList<>();
        boolean findWord = false;
        int wordBegin = 0;
        if (s.charAt(0) != ' ') {
            findWord = true;
        }
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i) != ' ' && !findWord){
                wordBegin = i;
                if(i == s.length() - 1){
                    strings.add(s.substring(wordBegin, i + 1));
                }
                findWord = true;
            } else if ((s.charAt(i) == ' ' || i == s.length() - 1) && findWord) {
                if(i == s.length() - 1 && s.charAt(i) != ' '){
                    strings.add(s.substring(wordBegin, i + 1));
                }else {
                    strings.add(s.substring(wordBegin, i));
                }
                findWord = false;
            }
        }
        StringBuilder result = new StringBuilder();
        for (int i = strings.size() - 1; i >= 0; i--) {
            result.append(strings.get(i)).append(" ");
        }
        result.deleteCharAt(result.length() - 1);
        return result.toString();
    }


}
